package main

import "fmt"

// Go中的方法，是一种特殊的函数，定义于struct之上(与struct关联、绑定)，
// 被称为struct的接受者(receiver)。
//方法就是有接收者的函数。

//语法
// type mytype struct{}
// func (recv mytype) my_method(para) return_type {}
// func (recv *mytype) my_method(para) return_type {}
// type Person struct {
// 	name string
// }
// func (per Person) eat() {
// 	fmt.Println(per.name + " eating...")
// }
// func (per Person) sleep() {
// 	fmt.Println(per.name + " sleep...")
// }
// func main() {
// 	var per Person
// 	per.name = "tom"
// 	per.eat()
// 	per.sleep()
// }
// type Customer struct {
// 	name string
// }

// func (customer Customer) login(name string, pwd string) bool {
// 	fmt.Printf("customer.name:%v\n", customer.name)
// 	if name == "tom" && pwd == "123" {
// 		return true
// 	} else {
// 		return false
// 	}
// }
// func main() {
// 	cus := Customer{
// 		name: "tom",
// 	}
// 	b := cus.login("tom", "123")
// 	fmt.Printf("b:%v\n", b)
// }

//方法接收者类型
//结构体传值传指针
// type Person struct {
// 	name string
// }

// func showPerson(per Person) {
// 	fmt.Printf("per:%p\n", &per)//per:0xc000088230
// 	per.name = "kite"
// 	fmt.Printf("per.%v\n", per)//per.{kite}
// }
// func showPerson2(per *Person) {
// 	fmt.Printf("per:%p\n", per) //per:0xc000088260
// 	per.name = "kite"
// 	fmt.Printf("per:%v\n", per) //per:&{kite}
// }
// func main() {
// 	p1 := Person{name: "tom"}
// 	fmt.Printf("p1:%p\n", &p1)//p1:0xc000088220
// 	showPerson(p1)
// 	fmt.Printf("p1:%v\n", p1)//p1:{tom}
// 	fmt.Println("----------------")
// 	p2 := &Person{name: "tom"}
// 	fmt.Printf("p2:%p\n", p2) //p2:0xc000088260
// 	showPerson2(p2)
// 	fmt.Printf("p2:%v\n", p2) //p2:&{kite}
// }

//方法传值，传指针
type Person struct {
	name string
}

func (per Person) showPerson() {
	fmt.Printf("per:%p\n", &per) //per:0xc00005e260
	per.name = "kite"
	fmt.Printf("per.%v\n", per) //per.{kite}
}
func (per *Person) showPerson2() {
	fmt.Printf("per:%p\n", per) //per:0xc00005e290
	per.name = "kite"
	fmt.Printf("per:%v\n", per) //per:&{kite}
}

// func main() {
// 	p1 := Person{name: "tom"}
// 	fmt.Printf("p1:%p\n", &p1) //p1:0xc00005e250
// 	p1.showPerson()
// 	fmt.Printf("p1:%v\n", p1) //p1:{tom} - 未修改
// 	fmt.Println("----------------")
// 	p2 := &Person{name: "tom"}
// 	fmt.Printf("p2:%p\n", p2) //p2:0xc00005e290
// 	p2.showPerson2()
// 	fmt.Printf("p2:%v\n", p2) //p2:&{kite} - 已更改
// }
